// 哈希表-开放定址法线性探测
#ifndef HASH_MAP_H
#define HASH_MAP_H

// 哈希表空间总长度
#define HASH_SIZE 100

// 表示这个键为空
#define NULL_KEY "NULL_KEY_VALUE"

/// @brief 哈希表结构体
typedef struct
{
	// 这里地址表示下标
	char *key[HASH_SIZE];	// 存放键的空间，其下标与value中对应的值是一一对应的
	char *value[HASH_SIZE]; // 存放数据（值）的空间
	int count;				// 元素个数
} HashMap;

/// @brief 创建一个哈希表
/// @return 哈希表对象指针
HashMap *createHashMap();

/// @brief 传入key计算出地址（使用除数留余法）
/// @param key 传入key（字符串）
/// @return 计算得到的地址
int hash(char[]);

/// @brief 重新定址，使用开放定址法线性探测
/// @param address 旧的地址
/// @return 新的地址
int reAddress(int);

/// @brief 计算一个键的地址
/// @param map 哈希表指针
/// @param key 键
/// @return 这个键在哈希表中的地址（下标），键不存在返回-1
int keyAddress(HashMap *, char[]);

/// @brief 存入元素到哈希表，使用开放定址法处理冲突
/// @param map 哈希表指针
/// @param key 传入key
/// @param value 存入的值
void putMap(HashMap *, char[], char[]);

/// @brief 从哈希表取出元素
/// @param map 哈希表指针
/// @param key 要取出的元素的键
/// @return 元素值
char *getMap(HashMap *, char[]);

/// @brief 从哈希表移除键及其对应的值
/// @param map 哈希表指针
/// @param key 要删除的元素的键
void removeKeyValue(HashMap *, char[]);

#include "./hash-map.c"

#endif